package chapter9;

import redis.clients.jedis.Jedis;

public class DistributedRedisLockDemo extends Thread {
    private static final String ACCOUNT_ID = "1234";

    /**
     * 程序入口主函数
     * 该函数的目的是模拟并发环境下对分布式Redis锁的需求
     * 通过创建并启动5个DistributedRedisLockDemo实例来模拟并发场景
     * 每个实例启动一个线程尝试获取分布式锁，从而验证分布式锁在并发环境下的有效性和稳定性
     */
    public static void main(String[] args) {
        for (int i = 0; i < 5; i++) {
            new DistributedRedisLockDemo().start();
        }
    }


    /**
     * 设置账户信息的方法
     * 此方法使用分布式锁来确保并发环境下账户信息的设置操作能够安全执行
     */
    public void setAccount() {
        // 获取当前线程的名称，用作锁的标识
        String sourceId = Thread.currentThread().getName();
        // 初始化锁获取标志为false
        boolean lockFlag = false;
        // 创建Jedis实例，连接本地Redis服务器
        Jedis jedis = new Jedis("127.0.0.1", 6379);
        try {
            // 尝试获取分布式锁，如果成功则执行业务逻辑，否则执行其他操作
            lockFlag = RedisLockUtil.tryGetDistributedLock(jedis, ACCOUNT_ID, sourceId, 10);
            if (lockFlag) {
                // 获取锁成功，执行业务逻辑
                System.out.println(sourceId + "获取锁成功，执行业务逻辑");
            } else {
                // 获取锁失败，执行其他操作
                System.out.println(sourceId + "获取锁失败");
            }
        } catch (Exception ex) {
            System.out.println(ex);
        } finally {
            // 如果成功获取了锁，则在业务逻辑执行完毕后释放锁
            if (lockFlag) {
                RedisLockUtil.releaseDistributedLock(jedis, ACCOUNT_ID, sourceId);
                System.out.println(sourceId + "释放锁成功");
            }
        }
    }

    @Override
    public void run() {
        try {
            setAccount();
        } catch (Exception e) {
            System.out.println(e);
        }
    }
}
